package com.example.distributed.locks.common;

import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.lang.reflect.Method;

/**
 * @author 谢汉冰
 * @Title: SpELUtils
 * @Package com.example.distributed.locks.common
 * @date 2023/10/23 14:46
 * @description: 解析SpEL表达式
 */
public class SpELUtils {

	/**
	 * 解析SpEL表达式
	 * @param key SpEL表达式
	 * @param method 反射得到的方法
	 * @param args 反射得到的方法参数
	 * @return 解析后SpEL表达式对应的值
	 */

	public static Object parseSpel(String key, Method method,Object[] args){
		ExpressionParser parser= new SpelExpressionParser();
		LocalVariableTableParameterNameDiscoverer parameterNameDiscoverer= new LocalVariableTableParameterNameDiscoverer();
		String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
		EvaluationContext context= new StandardEvaluationContext();
		if(args.length==parameterNames.length){
			for (int i = 0,len= args.length; i < len; i++) {
				context.setVariable(parameterNames[i],args[i]);
			}
		}
		return  parser.parseExpression(key).getValue(context);
	}
}
